#pragma once


/**
 * Szablon klasy wektora 3D.
 */
template<class T>
class Vector3
{
public:
    /**
     * Konstruktor domyslny.
     */
    Vector3()
        : _x((T)0), _y((T)0), _z((T)0)
    {
    }

    /**
     * Konstruktor ze wspolrzednymi.
     */
    Vector3(T x, T y, T z)
        : _x(x), _y(y), _z(z)
    {
    }


    /**
     * Konstruktor kopiujacy.
     */
    Vector3(const Vector3<T> &v)
        : _x(v._x), _y(v._y), _z(v._z)
    {
    }

    /**
     * Operator dodawania.
     */
    Vector3<T> operator+(const Vector3<T> &v)
    {
        return Vector3<T>(_x + v._x, _y + v._y, _z + v._z);
    }

    /**
     * Operator odejmowania.
     */
    Vector3<T> operator-(const Vector3<T> &v)
    {
        return Vector3<T>(_x - v._x, _y - v._y, _z - v._z);
    }

private:
    T _x;
    T _y;
    T _z;
};


/**
 * Wektor 3D o wspolrzednych typu int
 */
typedef Vector3<int> Vector3i;

/**
 * Wektor 3D o wspolrzednych typu float
 */
typedef Vector3<float> Vector3f;

/**
 * Wektor 3D o wspolrzednych typu double
 */
typedef Vector3<double> Vector3d;
